package com.example.theoretical_verification.collection;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MyArrayList02 {
    public static void main(String[] args) {
        Student02 s = new Student02("E", 12);
        Student02 s1 = new Student02("B", 23);
        Student02 s2 = new Student02("D", 25);
        Student02 s3 = new Student02("A", 35);
        Student02 s4 = new Student02("C", 15);
        Student02 s5 = new Student02("A", 21);
        List<Student02> list = Arrays.asList(s, s1, s2, s3, s4, s5);
        // 下面打印出来的顺序就是放入进入的顺序。也就是Arrays.asList(s, s1, s2, s3, s4, s5)的参数的摆放顺序
        System.out.println("原始的lsit没有做任何排序之前的打印结果" + "\n" + list);


        List<Student02> list02 = list.stream()
                .sorted()
                .collect(Collectors.toList());
        // 实际打印出来，就是按照Student02实现Comparable接口实现compareTo方法中定义的比较规则。
        System.out.println("遵循Student02的compareTo定义的规则排序之后：" + "\n" + list02);
        // 实际打印出来的东西，是按照Student02里面实现的升序的规则
        // 遵循Student02的compareTo定义的规则排序之后：
        //[Student{name='A', age=21}
        //, Student{name='A', age=35}
        //, Student{name='B', age=23}
        //, Student{name='C', age=15}
        //, Student{name='D', age=25}
        //, Student{name='E', age=12}
        //]


        // 实际打印出来，就是按照给sorted方法的比较器实现类中对于compare方法的具体实现。我们这里实现的是按name逆序。
        // sorted()方法括号里面传的就是一个比较器。之前我们用的是匿名内部类的写法，这里我们用了更加简洁的lamda写法。
        List<Student02> list03 = list.stream()
                .sorted((o1, o2) -> {
                    int num = o2.getName().compareTo(o1.getName());
                    return num == 0 ? o2.getAge() - o1.getAge() : num;
                })
                .collect(Collectors.toList());
        System.out.println("又额外给sorted方法传了一个比较器参数排序后的结果：" + "\n" + list03);
        // 实际打印出来的是按照构造器的规则。也就是name、age逆序
        // 又额外给sorted方法传了一个比较器参数排序后的结果：
        //[Student{name='E', age=12}
        //, Student{name='D', age=25}
        //, Student{name='C', age=15}
        //, Student{name='B', age=23}
        //, Student{name='A', age=35}
        //, Student{name='A', age=21}
        //]
    }
}








